Corso di PICmicro™
![]() ![]() ![]() Caratteristiche di rilievo dell'integrato: Piedinatura
e descrizione linee:rA0 -> rA4:
5linee di i/o Ci sono 4 possibili modi per fornire un clock all'integrato: ![]() ![]() Riepilogo: per fare 'girare' il programma in un pic, è necessario: collegare vcc e massa, collegare una res tra mclr e vcc, aggiungere la coppia rc sul 16 o il quarzo. La prima basetta la montate in 2 minuti. Nota: per visualizzare lo stato di una uscita ra o rb, porre in serie un led con resistenza a massa. Suggerisco R=280Ohm collegata al piedino, e al diodo led con catodo (taglietto) a massa. ![]() ![]() ![]() Esistono diversi tipi di programmatori, e se andate a comprarli nei negozi, i più miseri costano più di 200K£; questo scoraggia molto. Esistono però molti programmatori 'alternativi' come il ludipipo o il JDM. Il primo è il più usato perchè composto da 4 resistenze, 1 condensatore e 2 diodi!! ![]() MultiPippo: Il multipippo al quale faccio riferimento è un programmatore creato da ooz e bubz (due nomi storici per le pay tv italiane :) sulla base del ludipipo originale di Ludwig cattas. Il LudiPipo è compatibile con tantissimo software freeware: pic.exe, picprog, icprog, ponyprog, k-burner (l'ho fatto io!!), etc.. e supporta 16c84, 16f84, tutte le eeprom 24cxx (04,16,32,64,..), il 12c508 (modifica psx!), e tanti altri, è indispensabile e costa come un paio di caffè! ![]() MultiPippo schematics: Se andate sui link che vi propongo alla fine, trovate tanti programmatori del genere, io mi limito a farvi lo schema, visto che nel sito sono presenti solo i pcb per le basette fatte con l'acido!
![]() Lista materiali: tutte le resistenze sono da 1/4 di watt. I diodi da 1/2.
Riepilogo: correte a comprare il materiale se non lo avete in casa e vedrete che in 5 minuti al massimo montate lo schemino che vi ho riportato.. 4res, 2diodi, 2c.. Montate tutto su millefori (consiglio componenti stagnati su millefori e collegamenti fatti sotto con filo), vi basteranno 5x4cm al massimo, vedrete che ne vale la pena... ![]() ![]() ![]() Costruito il programmatore? Se si continua a leggere, se no, fallo lo stesso, così vedi quanto è facile programmare un pic! Io consiglio di usare il 'pic.exe' (anche 'pic24c13.exe' reperibile in giro per la rete) che però può dare problemi se usato da windows, quindi al riavvio del PC, shift+F5 e siete al prompt, così lanciate pic.exe senza problemi. Anche ICprog x Win9x è buono, ma di win mi fido sempre poco :-). NB attualmente ICprog è alla versione 1.2, mentre quello nella foto è il 0.9e..
A) caricamento dell'hex. Tale file non è altro che la mappa della memoria programma del pic, che durante la programmazione sarà copiata all'interno del pic.I file hex sono il risultato creato dalla compilazione di un file asm. Tale file contiene le istruzioni che il pic dovrà eseguire. Un apposito programma converte le istruzioni in numeri e genera il file 'nome.hex' che andrà inserito nel pic. Se usate pic.exe i file hex vanno copiati nella cartella del pic (consiglio c:\pic) così state presto ad entrarci da dos. Andate in 'loal hex' dal menu file e apritene uno. Analoga procedura per i programmi da windows, che però consentono di spostarsi tra le cartelle. ![]() B) settaggio dei 'fuses'. I fuses sono delle celle di memoria che vengono programmate sul pic alla fine della scrittura del codice. Servono per indicare la modalità di funzionamento. Sono 4: Perchè il pic funzioni correttamente è importante il settaggio dei fuses; di solito NO,YES,NO,RS. ![]() Ora è possibile programmare il pic cliccando su program. Se avete seguito le istruzioni alla lettera entro breve la barretta arriverà al 100% segnando la fine della programmazione. Vedrete che dalla seconda programmazione in poi, farete tutto in 10 secondi! Riepologo: Per programmare inserire il pic e collegare la seriale al pc. Copiare l'hex nella cartella del pic.exe, lanciarlo, caricare l'hex, settare i fuses (se non sono gia corretti nell'hex caricato), programmare e se volete per sicurezza controllate la scrittura ('compare'). Siete pronti per mettere il pic sulla sua basetta e godervi il frutto delle vostre fatiche!! ![]() ![]() ![]() A questo punto dovreste almeno essere in grado di discernere un pic da un'aspirapolvere, riuscure ad inserirlo nel programmatore (dove stavate cercando di inserire la coda del gatto) e programmarlo con un file hex (se durante la programmazione si illumina + di una lampadina da 100W e fa + fumo dei fumogeni da disco, allora non dovevate collegarlo al 220!). Ok, ora arriva la parte software che inizialmente può essere un po difficile da comprendere, ma alla fine vedrete che risulta naturale, dato che si utilizzano al massimo una ventina di istruzioni diverse (su 35 che il pic ci mette a disposizione). Iniziamo a descrivere il processo di compilazione, ovvero di creazione di un .hex a partire da un .asm. Tale operazione viene eseguita dall' MPASM, il compilatore free che la microchip mette a disposizione aggratis. Dal sito www.microchip.com scaricatevi l'ultima versione dell'MPLAB (attuale 5.11.03), il software che vi permette di scrivere il programma per pic, compilarlo e vedere se presenta errori. In caso contrario produrrà il file hex relarivo al programma. Come si vede dal disegno qui sotto, per programmare un pic bisogna seguire le seguenti fasi: ![]() Nel caso non ci siamo errori, l'hex è buono e
possiamo scriverlo sul pic, altrimenti nell'err (o nella schermata di
errore dell'MPLAB) trovate la descrizione degli errori.
Quanto detto risulta molto più semplice a farsi che a dirsi. Cmq voi prelevate il programma, installatelo e vedrete che è semplicissimo da usare. L'importante è all'inizio creare un project e dargli un nome. Con quello stesso nome dovrete creare il file asm, tornare nel progetto, fare 'add node' e specificare il file asm creato. Una volta fatto ciò non avrete più problemi di compilazione! Finora vi ho dato gli stumenti per creare un programma partendo da un testo, e metterlo all'interno della flash del pic. Ora però vi serve per forza una mini guida su come programmare. Esiste 'Pic by Example', una guida in italiano di Sergio Tanzilli, disponibile su www.tanzilli.com che insegna partendo da zero l'assembly per pic. L'ho utilizzata io agli inizi, e vi assicuro che in un giorno se gia sapete qualcosa, guardando gli esempi diverrete degli abilissimi programmatori. Riepilogo: Scaricare ed installare l'MPLAB. Creare un nuovo pregetto con con pic 16f84. Creare un file asm (inizialmente vuoto) e salvarlo con nome nomeprogetto.asm. Andare in Edit Project ->add node, specificare il file asm e dare ok. Scrivete il programma nella finestra dell'asm, compilate per vedere se ci sono errori. Se no, verrà creato il file .hex che tratterete come già descritto. ![]() ![]() ![]() ![]() Primo esempio: effetto SuperCar con 12 LED! Spero che prima di arrivare qui abbiate gia guardato il corso di Tanzilli xè la descrizione che qui darò dei comandi sarà molto sinetica. Riporto di seguito il codice dell'ASM in questione (lo faccio al momento, ma dovrebbe essere esatto) commentandolo ove si presenti la necessità. Per realizzare un effetto supercar, possiamo utilizzare le porte di i/o del pic settate come uscita. Ma poichè rA4 è open-collector (non da in uscita il livello alto), evitiamo di usarlo. Utilizzeremo quindi rB0-rB7 e rA0-rA3. 12 linee che saranno collegate tramite altrettante resistenze ad una fila di led con il catodo (il taglietto) a massa. Per Settare dei valori alti/bassi, è sufficiente scrivere sulla porta (a o b). Ovviamente possiamo anche compiere rotazioni, e facendolo sulla porta otteniamo lo scorrimento di un led. Ma come passare da rb7 a ra0 e viceversa? il concetto è semplice. Ruotando, si spostano tutti i bit a destra o sinistra di uno, il bit che entra proviene dal carry (che noi metteremo a zero per far entrare uno zero) e quello che esce va a finire nel carry. Va da se che ruotando a sinistra la porta B, il bit che esce andrà in carry e ruotando a sinistra la porta A, otterremo il passaggio del bit uscito da rb7 a rA0. Useremo inoltre due routines, una che fa salire il bit e una che lo fa scendere, con un controllo alla fine per invertire il senso di marcia dei bit. Infine ci sarà una routine di delay che ci permetterà di vedere l'effetto supercar, che, se non ci fosse il ritardo via software si tramuterebbe in una riga di led sempre accesi. Analizziamo dunque il sorgente PROCESSOR 16F84 RADIX DEC INCLUDE "P16F84.INC" __CONFIG 3FF3H ORG 0CH Count RES 2 Direz RES 1 ORG 00H bsf STATUS,RP0 movlw 00000000B movwf TRISA movlw 00000000B movwf TRISB bcf STATUS,RP0 bsf PORTB,4 -> alza il 5° piedino (rB4) della porta
B, ponendolo a livello alto.Significato di questo blocco: TRISA e TRISB sono i registri (8 cellette di memoria) che specificano se le porte A e B sono di ingresso o uscita. 0 significa uscita, 1 ingresso. Caricando 0 in a e in B, otteniamo la configurazione delle 2 porte come porte di uscita. Per andare a modificare questi 2 registri dobbiamo prima mettere a 1 RPO. Alla fine lo rimettiamo a 0. Una istruzione tipo: bsf TRISB,3 -> non fà nulla se RP0 è basso,
mentre se viene eseguita prima che venga abbassato RP0, setta la 4a linea
della porta A come ingresso.movlw 00000001B movwf PORTB clrf PORTA clrf Direz clrf Count clrf Count+1 bcf STATUS,C Significato del blocco. PORTB è la porta B; scrivendo su questa si vanno a cambiare gli stati delle linee della porta B. In pratica; della porta B viene attivata solo la prima linea (bit 0) le altre tutte basse. Tutte basse anche quelle della porta A. Mettiamo a 0 la variabile Direzione (0 = salita 1 = discesa), la Count e la Count+1 (che non ha nome, ma per count avevamo riservato 2 bytes). Notare che Count+2 corrisponderebbe a Direz. Infine viene pulito il bit CARRY che si trova nel registro STATUS, dove avevamo incontrato anche RP0. Ora arriva il programma principale: MainLoop call Delay btfss Direz,0 goto Sali In questo blocco, dopo avere ritardato di un po' l'esecuzione con la funzione delay, si controlla se stiamo salendo o scendendo. Nel primo caso il bit 0 di direz è a 0, per cui salterà alla funzione 'Sali', mentre se fosse a 1 continuerebbe l'esecuzione saltando il 'goto Sali'. Ovviamente laddove salterà ci sarà la funzione scendi. Scendi rrf PORTA,F rrf PORTB,F btfsc PORTB,0 bcf Direz,0 goto MainLoop Come spiegato in precendenza, faccio scorrere verso giu il bit ruotando a destra dalla porta A alla porta B. Successivamente controllo se sono a fine discesa (cioè ho l'1 nel bit 0 della PORTB). Se no, continua daccapo, altrimenti cambia direzione (da 1 a 0) e riparti daccapo. Sali rlf PORTB,F rlf PORTA,F btfsc PORTA,3 bsf Direz,0 goto MainLoopCome la precedente scendi. Viene chiamata si il bit 0 di 'Direz' vale '0'. Ruota a sinistra finchè non raggiungiamo il 4° bit della porta A, a quel punto.. si scende! Delay movlw 40 movwf Count+1 DelayLoop decfsz Count,F goto DelayLoop decfsz Count+1,F goto DelayLoop return In questo blocco, settiamo a 40 il valore di Count+1. Poi c'è un ciclo interno che ripete 256 volte il decremento di Count e la goto, e un ciclo più esterno che ripeterà 40 volte il ciclo interno. Per ottenere un ritardo accettabile insomma, dobbiamo fare circa ventimila operazioni per niente!! ENDFinalmente l'ultima direttiva: END chissà a che serve... Riepilogo: Per assemblare il codice e fare l'hex ricopiare il programma in un .asm e compilarlo con l'MPLAB come descritto nel 3° capitolo. In seguito mettetelo nel pic, create il circuito base come descritto nel punto uno, stagnate i led in fila con il meno a massa e le resistenze in ordine da rB0 a rA4. Alimentate con una pila da 4,5 o 6 volt e il gioco è fatto!
|